AWS SAM CLIにプルリクエストを出してみた
いわさです。
先日、AWS SAM CLIがアップデートされて、X-Rayトレースの有効化オプションが追加されました。
記事のさいごに書いたのですが、この機能ではLambdaのみX-Rayが有効化され、API Gatewayは対象外となっています。
そのため、Functionsリソースを使ってSAMをデプロイしても、一緒に作成されるAPI GatewayのX-Ray機能は有効化されないままです。
これについてIssueという形でフィードバックしてみたところ、「良いアイディアだ、コードはここだ」とのお返事が。
作成したIssueを見ていると、contributors/good-first-issue
のラベルが追加されていました。
このラベルは、初めてのコントリビュートに適切なIssueであることを示すラベルです。
そこで、今回はプルリクエストを出すところまでやってみることにしました。
どういう変更を行ったかについてはプルリクエストを見て頂ければわかるので触れないですが、この記事ではSAM CLIのコードを修正し、テストを行い、プルリクエストを送るおおまかな流れを紹介します。
やること
外部のリポジトリへプルリクエストを出すまでの流れは以下の記事にまとめられています。
そして、SAM CLIのリポジトリは以下です。
SAM CLIのコントリビュート方法を確認する
Contributing Guidelinesでは、このリポジトリでのコントリビュートに関連する流れや注意事項・お作法などが記載されています。
これは初めによく読んでおきます。といってもボリュームはさほど多くないです。
プルリクエストの作成に取り組む前にまず実施すべきことなどが記載されています。
Development Guideにはこのリポジトリで開発・テストに必要な情報がほぼまとまっています。こちらは事前に読むというより、開発しながらフェーズ毎に読むと良いと思います。
開発環境の作成方法からテストの実施方法、プルリクエスト前に実施するmake
などなど。
自動化されている部分がこの手順に従うだけで実行されるので、コードの実装とテストだけに集中出来ます。
フォークして自分のリポジトリで開発とテストを行う
基本的なローカル開発の流れ(フォークしてコードを修正する部分)は他のリポジトリと同じなので割愛します。
SAM CLIはPythonで開発されたツールで、本日時点ではPython3.7と3.8をサポートしています。
Python環境の作成が必要なのですが、Development Guideに従ってpyenv
をセットアップしました。
セットアップ後にバージョン番号を変更するだけですが、簡単な修正をすぐに試すことが出来ます。
(samcli38) hoge@fuga aws-sam-cli % make init SAM_CLI_DEV=1 pip install -e '.[dev]' Obtaining file:///Users/iwasa.takahito/src/aws-sam-cli : (samcli38) hoge@fuga aws-sam-cli % echo '__version__ = "123.456.789"' >> samcli/__init__.py (samcli38) hoge@fuga aws-sam-cli % samdev --version SAM CLI, version 123.456.789
samdev
へすぐに修正した内容が反映されるので、開発とテストを進めていきます。
テストはmake test
で実施出来ます。こちら、テストカバレッジ95%が基準になっているのですが、一部テストがdocker環境が必要なので起動しておきましょう。
ちなみに、Makefileは以下のようになっていて、単体テスト・結合テスト・プルリクエスト送信前のチェックなど実施出来ます。
このあたりもDevelopment Guideにどういう時に何を実行するかは記載されています。
# Default value for environment variable. Can be overridden by setting the # environment variable. SAM_CLI_TELEMETRY ?= 0 init: SAM_CLI_DEV=1 pip install -e '.[dev]' test: # Run unit tests # Fail if coverage falls below 95% pytest --cov samcli --cov-report term-missing --cov-fail-under 95 tests/unit test-cov-report: # Run unit tests with html coverage report pytest --cov samcli --cov-report html --cov-fail-under 95 tests/unit integ-test: # Integration tests don't need code coverage @echo Telemetry Status: $(SAM_CLI_TELEMETRY) SAM_CLI_DEV=1 pytest tests/integration func-test: # Verify function test coverage only for `samcli.local` package @echo Telemetry Status: $(SAM_CLI_TELEMETRY) pytest --cov samcli.local --cov samcli.commands.local --cov-report term-missing tests/functional regres-test: @echo Telemetry Status: $(SAM_CLI_TELEMETRY) SAM_CLI_DEV=1 pytest tests/regression smoke-test: # Smoke tests run in parallel SAM_CLI_DEV=1 pytest -n 4 tests/smoke lint: # Linter performs static analysis to catch latent bugs pylint --rcfile .pylintrc samcli # mypy performs type check mypy setup.py samcli tests # Command to run everytime you make changes to verify everything works dev: lint test black: black setup.py samcli tests black-check: black --check setup.py samcli tests # Verifications to run before sending a pull request pr: init dev black-check update-reproducible-reqs: python3.7 -m venv venv-update-reproducible-requirements venv-update-reproducible-requirements/bin/pip install --upgrade pip-tools pip venv-update-reproducible-requirements/bin/pip install -r requirements/base.txt venv-update-reproducible-requirements/bin/pip-compile --generate-hashes --allow-unsafe -o requirements/reproducible-linux.txt
プルリクエストを作成する
ローカルブランチでmake pr
が成功したらフォーク元へのプルリクエスト作成しましょう。
プルリクエストのテンプレートに従って情報を英語で記入していきます。
チェックリストにも回答しましょう。いくつかのプルリクエストを確認しましたが、必要な項目がチェックできていれば良いようです。例えば、今回の場合だとドキュメント修正は不要な修正なので、ドキュメント修正はチェックしていないです。
プルリクエスト実施後、パイプラインが動作します。
make pr
が通っていれば成功するはずですが、私の時は基盤のAppVeyor側で429 Too Many Requests
が発生していました。
こちらは、時間を変えて実行することで、パスすることが出来ました。
SAM CLIの場合は2名以上のレビューアーの承認が必要です。
プルリクエスト上で何度かやり取りをして承認をしてもらいました。
なお、レビューの過程では少し時差を感じました。
日本の深夜に微修正のコミットを頂いたりして、靴屋の妖精みたいな...
さいごに
この記事で、SAM CLIのリポジトリへ修正をしてプルリクエストを行うまでの流れを紹介させて頂きました。
Development Guideに従って開発環境用意してmakeコマンド使うだけでPR作成まで簡単に進めます。想定よりだいぶ簡単だったので、SAM CLIで修正したい点がある方は是非気軽にコントリビュートしてみてください。
さいごに、今回作成したプルリクエストはこちらになります。
マージされたプルリクエストがどこかでアップデートとして配布されるのかよくわかってないのですが、配布されたら自分でアップデート記事として紹介出来たらおもしろいなぁなんて思いました。